/**
 * @FileName Handler.java
 * @Package com.designMode.chainOfResponsibility
 * -------------------------------------
 * @function Please write description of function
 * @Date 2016-1-6 下午2:40:49
 * -------------------------------------
 * Copyright (c) 2016,顾博君 All Rights Reserved.
 */
package com.designMode.chainOfResponsibility;

/**
 * @author 顾博君
 * @ClassName Handler
 * @Date 2016-1-6 下午2:40:49
 * @Function 抽象处理者
 */
public abstract class Handler {
    /**
     * 下一个处理者
     */
    private Handler nextHandler;

    /**
     * 处理请求
     *
     * @param request 请求
     * @return 响应结果
     */
    public final Response handleMessage(Request request) {
        Response response = null;
        // 如果级别相同，处理任务
        if (getHandlerLevel().equals(request.getRequestLevel())) {
            System.out.println("找到了处理者：处理者Level" + getHandlerLevel().getLevel());
            //开始处理任务
            response = echo(request);
        }
        // 如果级别不同,责任链还有下一个处理者
        else if (nextHandler != null) {
            System.out.println("当前处理者：处理者Level:" + getHandlerLevel().getLevel());
            System.out.println(" ->下一个处理者：处理者Level:" + nextHandler.getHandlerLevel().getLevel());
            // 让下一个处理者接收请求，并返回处理响应
            response = nextHandler.handleMessage(request);
        }
        return response;
    }

    /**
     * 设置下一个处理者是谁
     *
     * @param _handler 下一个处理者
     */
    public void setNext(Handler _handler) {
        this.nextHandler = _handler;
    }

    /**
     * 每一个处理者有一个处理级别
     *
     * @return 处理级别
     */
    protected abstract Level getHandlerLevel();

    /**
     * 每一个处理者必须实现处理任务
     *
     * @param request 处理请求
     * @return 处理响应
     */
    protected abstract Response echo(Request request);
}
